package org.hbgl.geoentity.admin.web.unit;

import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.hbgl.geoentity.admin.web.BaseController;
import org.hbgl.geoentity.core.util.JacksonUtil;
import org.hbgl.geoentity.core.util.RegexUtil;
import org.hbgl.geoentity.core.util.ResponseUtil;
import org.hbgl.geoentity.core.util.bcrypt.BCryptPasswordEncoder;
import org.hbgl.geoentity.db.domain.GeSystemparameter;
import org.hbgl.geoentity.db.domain.GeUnit;
import org.hbgl.geoentity.db.domain.GeUser;
import org.hbgl.geoentity.db.util.EnumFile;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.hbgl.geoentity.admin.util.ResponseCode.*;

/**
 * 代码功能：单位注册
 * 开发日期：2022/5/13
 * 作者：蒋海仑
 * 联系方式：
 * 版本更迭说明：
 * 版权信息：河北广联信息技术有限公司
 */
@RestController
@RequestMapping("/unit/unit")
@Validated
public class UnitUnitController extends BaseController {


    /**
     * 检查用户名是否可用
     *
     * @param body { username : 用户名 }
     */
    @PostMapping("/checkUsername")
    public Object checkUsername(@RequestBody String body) {
        String username = JacksonUtil.parseString(body, "username");
        if (!ObjectUtils.allNotNull(
                username
        )) {
            return ResponseUtil.badArgument();
        }
        if (StringUtils.isBlank(username)) {
            return ResponseUtil.fail(402, "用户名不能为空");
        }
        if (!RegexUtil.isUsername(username)) {
            return ResponseUtil.fail(USER_INVALID_NAME, "用户名不符合规定（长度在6-20位“aA-zZ”、“0-9”、“_”、“汉字”组成，不能以“_”结尾）");
        }

        List<GeUser> userList = userService.findByUsername(username);
        if (userList.size() > 0) {
            return ResponseUtil.fail(USER_NAME_EXIST, "用户名已经存在");
        }

        return ResponseUtil.ok();
    }

    /**
     * 检查单位名称是否可用
     *
     * @param body { unitname : 单位名称 }
     */
    @PostMapping("/checkUnitname")
    public Object checkUnitname(@RequestBody String body) {
        Integer id = JacksonUtil.parseInteger(body, "id");
        String unitName = JacksonUtil.parseString(body, "unitName");
        if (!ObjectUtils.allNotNull(
                unitName
        )) {
            return ResponseUtil.badArgument();
        }
        if (StringUtils.isBlank(unitName)) {
            return ResponseUtil.fail(402, "单位名称不能为空");
        }

        List<GeUnit> unitList;
        if (id != null) {
            unitList = unitService.findByUnitName(id, unitName);
        } else {
            unitList = unitService.findByUnitName(unitName);
        }
        if (unitList.size() > 0) {
            return ResponseUtil.fail(USER_NAME_EXIST, "单位名称已经存在");
        }

        return ResponseUtil.ok();
    }

    /**
     * 参数校验
     *
     * @param unit 单位信息
     * @param user 账号信息
     */
    public Object validate(GeUnit unit, GeUser user) {
        if (!ObjectUtils.allNotNull(
                user.getUsername(), user.getPassword(),
                unit.getUnitName(), unit.getUnitCode(), unit.getUnitAddress(), unit.getProvinceCode(),
                unit.getCityCode(), unit.getAreaCode(), unit.getUnitType(), unit.getTradeId(),
                unit.getLicense(), unit.getEmail(), unit.getLinkphone(), unit.getCorporation(), unit.getCredentials()
        )) {
            return ResponseUtil.badArgument();
        }
        if (!RegexUtil.isUsername(user.getUsername())) {
            return ResponseUtil.fail(USER_INVALID_NAME, "用户名不符合规定（长度在6-20位“aA-zZ”、“0-9”、“_”、“汉字”组成，不能以“_”结尾）");
        }
        if (user.getPassword().length() < 6) {
            return ResponseUtil.fail(USER_INVALID_PASSWORD, "密码长度不能小于6");
        }

        List<GeUser> userList = userService.findByUsernameCheck(user.getUsername(), false);
        if (userList.size() > 0) {
            return ResponseUtil.fail(USER_NAME_EXIST, "用户名已经存在");
        }

        List<GeUnit> unitList = unitService.findByUnitName(unit.getUnitName());
        if (unitList.size() > 0) {
            return ResponseUtil.fail(USER_NAME_EXIST, "单位名称已经存在");
        }
        return null;
    }

    /**
     * 单位注册
     *
     * @param body { username : 用户名, unitname : 单位名称, ... }
     */
    @PostMapping("/register")
    public Object register(@RequestBody String body) {
        GeUnit unit = JSON.parseObject(body, GeUnit.class);
        GeUser user = JSON.parseObject(body, GeUser.class);
        user.setRealname(unit.getLinkman());
        user.setTelephone(unit.getLinkphone());
        Object error = validate(unit, user);
        if (error != null) {
            return error;
        }
        // GeSystemparameter node_idcode = systemparameterService.selectByCode(EnumFile.SystemParameter.NODE_IDCODE);
        // if (node_idcode == null) {
        //     return ResponseUtil.fail(402, "本节点尚未激活，无法注册单位");
        // }

        Object o = verifyUnitinfoAuthenticity(unit);
        if(o!=null) {
            Map<String, Object> obj = (Map<String, Object>) o;
            if(obj.containsKey("errno")) {
                if(!obj.get("errno").toString().equals("0")) {
                    return o;
                }
            }else {
                return ResponseUtil.fail();
            }
        }

        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        user.setPassword(encoder.encode(user.getPassword()));
        unitService.add(unit, user);

        return ResponseUtil.ok();
    }

}
